istio Authorization 拒絕指定檔案瀏覽

前言

接到個需求,要限定網站的某個副檔名不能被瀏覽。

正文

Authorization-policy的yaml

Rule規則分成三大塊

From
請求來源
To
請求目的
When
指定的請求附加條件

To

nginx查一下,是有類似的東西。
但istio我看了官方文件,
寫法是

- to:
  - operation:
      paths: ["/user/profile/*"]

目前只有支援單個 *

現在的目標是要阻擋 index-erscvs.js.map ,禁止任何人觀看。
但 index-erscvs.js 不能被deny

於是

kind: AuthorizationPolicy
metadata:
  name: frontend-map-policy
spec:
  selector:
    matchLabels:
      group: frontend
  action: DENY
  rules:
    - to:
      - operation:
          hosts: ["abc.def.com"]
          ports: ["80"]
          paths: ["*.js.map"]

優先順序評估表 Custom > Deny > Allow

ref. Authorization Policy

When

注意,values不支援CIDR,需用* 代替私有網段

這邊沿用 186. istio的Authorization policy(白名單) 的方式,
設定白名單。

於是,下面的設定方式,label 是 group=frontend的deploy,
不允許訪問*.js.map的檔案,除了來源是 123.123.123.123

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: frontend-map-policy
spec:
  selector:
    matchLabels:
      group: frontend
  action: DENY
  rules:
    - to:
      - operation:
          hosts: ["abc.def.com"]
          ports: ["80"]
          paths: ["*.js.map"]
      when:      
      - key: request.headers[X-Envoy-External-Address]
        notValues:
          - "123.123.123.123" 

驗證時,可以用下面的指令協助查詢,
要注意是不是被其他的policy影響了

# 先開啟debug模式,資訊比較多,查完後將deploy重啟即可
istioctl proxy-config log deploy/httpbin --level "rbac:debug" | grep rbac

for i in {1..20}; do curl -H 'Cache-Control: no-cache, no-store' https://abc.def.com/assets/index-d74bceac.js -s -o /dev/null -w "%{http_code}\n"; done

kubectl logs <pod name> -c istio-proxy

注意

when 跟 to 如果用 下面方式的話,表示是兩條規則

...
	- to:
		...
	- when:
		...

這樣才是同一條規則,
我犯了這個蠢錯誤

	- to:
		...
	  when:
		...

ref.